#ifndef ALGORITHMIMAGE_HPP
#define	ALGORITHMIMAGE_HPP

#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <boost/thread.hpp>


#include "visualization.hpp"

using namespace cv;

class AlgorithmImage {
public:


    AlgorithmImage(unsigned int width, unsigned int height);
    virtual ~AlgorithmImage();

    void insertColorIntensity(unsigned int min, unsigned int max, Color color);

    /*---------------------Usado para a segmentacao em cores------------------*/

    void findConnectedComponents();
    void segmentedImage();

    void setImageOpenCV(char *data) {
        cvSetData(image, data, image->widthStep);
    }

    void setImageOpenCV(unsigned char *data) {
        cvSetData(image, data, image->widthStep);
    }

    IplImage* getImageOpenCV() {
        return image;
    }

    int* getColors() {
        return colors;
    }

    CvRect* getRects() {
        return rect;
    }

    CvPoint* getCenters() {
        return centers;
    }

    unsigned int getNumRec() {
        return numRect;
    }
    /*------------------------------------------------------------------------*/
private:

    /* Funcoes e elementos usados para programar a busca
     por segmentacao em cores*/

    /*---------------------Usado para a segmentacao em cores------------------*/

    //Segmenta varias imagens em cores, separadas
    void segmentedByColors();
    //Acha os contornos por imagem segmentada !!!
    void findCountorsByColor(IplImage *temp, IplImage *seg,
            CvScalar scalar, int *numColors, CvPoint* centers);

    /*Variaveis para o controle da iluminacao */
    ColorIntensity __cyan, __green, __orange, __pink;

    /* Variaveis para a implementacao dos algoritimos de traking */
    uchar *colorImg;
    uchar *tempImgCyan, *segImgCyan;
    uchar *tempImgGreen, *segImgGreen;
    uchar *tempImgOrange, *segImgOrange;
    uchar *tempImgPink, *segImgPink;

    //Variaveis para segmentacao em separado de cada cor
    IplImage *image, *hsv;
    IplImage *tempCyan, *segCyan;
    IplImage *tempGreen, *segGreen;
    IplImage *tempOrange, *segOrange;
    IplImage *tempPink, *segPink;

    //Variaveis usadas para calculo de numeros de 
    //segmentos encontrados, juntamente com suas
    //informacoes
    unsigned int numRect;
    int colors[4 * NUM_MAX_BLOBS];
    CvRect rect[4 * NUM_MAX_BLOBS];
    CvPoint centers[4 * NUM_MAX_BLOBS];
    double perimScale;
    int poly1_hull0;

    /*------------------------------------------------------------------------*/

    /* Variaveis para o tamanho da imagem*/
    unsigned int height, width;
};

#endif	/* ALGORITHMIMAGE_HPP */

